#ifndef B2D_RECT_H
#define B2D_RECT_H

#include "Maths.h"

NS_B2D_BEGIN

////////////////////////////////////////////////////////////////////////////////////////////////////
/// \brief	Rectangle shape.
///
/// \tparam	T	Generic type parameter.
////////////////////////////////////////////////////////////////////////////////////////////////////
template<typename T>
class B2D_API Rect final
{
public:
	typedef typename tvec2<T> vec2_t;

	vec2_t position;
	vec2_t size;

public:
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Default constructor.
	/// 		Creates an empty rectangle
	////////////////////////////////////////////////////////////////////////////////////////////////////
	Rect(void);
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Constructor.
	///
	/// \param	x	  	The x position.
	/// \param	y	  	The t position.
	/// \param	width 	The width.
	/// \param	height	The height.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	Rect(T x, T y, T width, T height);
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Constructor.
	///
	/// \tparam	U		Type of the vectors.
	/// \param	pos 	The position.
	/// \param	size	The size.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	template<typename U>
	Rect(tvec2<U> pos, tvec2<U> size);
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Constructor from another rectangle.
	///
	/// \tparam U	Type of the rect to copy.
	/// \param	r	The rect to copy.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	template<typename U>
	explicit Rect(const Rect<U>& r);

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Gets the area.
	///
	/// \return	The area.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	T getArea(void) const;

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// \brief	Gets the center.
	///
	/// \return	The center.
	////////////////////////////////////////////////////////////////////////////////////////////////////
	vec2_t getCenter(void) const;
};

typedef Rect<float> Rectf;
typedef Rect<int>	Recti;
typedef Rect<uint>	Rectu;

#include "Rect.inl"

NS_B2D_END

#endif